#include <QTextCodec>
#include <QtCore/QCoreApplication>
#include "dryctrlthread.h"
#include "KgGlobalData.h"
#include <unistd.h>
#include <QDir>

/*
2020-10-26     V1.8:   加入通信故障和恢复记录到BA日志.
2020-11-02     V1.9:   加入通用版宏(MASTER_VER)和南都版宏(ND_VER); 加入告警干结点配置(DoID=10).
2020-12-03     V1.10:  加入急停信号采集(DIStrategy=10)
2020-12-23     V1.10:  修改急停信号采集(DIStrategy=11)并通知BA。
2021-02-22     V1.11:  加入消防, 急停, 防雷信号的常闭,常开(默认)配置.
2021-02-26     V1.12:  加入运行灯干结点（DO，ID=6），提取控制汇流开关函数controlHzFz（）。
2021-03-13     V1.12:  实现多个DI同时采集急停急号，防雷信号，消防信号，增加急停策略宏定义。
2021-03-18     V1.12： 急停急号，防雷信号，消防信号确认时间做成配置参数。
2021-03-23to25 V1.12： 通迅故障作为急停处理, 加快急停急号判断,提取函数dealwithConnFailed()
2021-04-17     V1.13:  加入南都版的上电,下电处理
2021-04-30,5-13,5-27:  南都娄底项目,力神珠海项目,万里扬甘肃华庭项目处理,日志增加英文
2021-05-28     V1.14:  加入隔离开关策略(DIStrategy=2)并通知BA。
2021-05-30     V1.15:  修改有实时告警时才去动作告警干结点,不看总状态0x5555,0x1111,0x2222 青岛威控项目
2021-06-22     V1.16:  加入汇流开关反馈配置(DI1AlarmValue=1表示闭合(常用))
2021-07-16     V1.17:  加入操作故障干结点等日志，并根据主版本显示中文或英文
2021-07-17     V1.17:  读到DI发生变化写入到日志，隔离开关状态变化写入到日志
2021-07-18,19  V2.0:   实现读见IO只通过3条命令(DI,DO最多各支持8个)
2021-07-20     V2.0:   完善合闸口分闸口默认是断开的
2021-09-10     V2.1:   加入20:充电接触器驱动 21:放电接触器驱动
2021-09-19     V2.2:   加入检测多个汇流开关的反馈 亿纬尼日尔630A
2021-10-07     V2.3:   加入可以同时控制多个DO口分励脱扣
2021-10-29     V2.4:   加入DO口消防脱扣策略-109 平高大庆项目
2021-11-03     V2.4.1: 修改上传IO数据到通用寄存器(slaveID=100)
2021-11-27     V2.4.2: 加入水浸检测策略(DIStrategy=10)
2021-12-07     V2.4.3: 加入可燃气体检测策略(DIStrategy=12)
2021-12-10     V2.4.4: 加入南都版消防告警时通知后台(pStack->usStackTotAlarm -- Bit8:消防告警)
2021-12-28     V2.4.4: 修改BA不加入可燃气体检测策略,只将信号传给后台
2022-01-06     V2.4.5: 加入读取到可燃气体等信号日志;改刚发生急停时，立马断开汇流开关，不延时
2022-01-07     V2.4.5: 实现按急停按钮可断开汇流开关.
2022-01-09to11 V2.4.6: (1)实现急停和消防时立刻断开汇流开关；(2)断开失败时不断重复;(3)操作成功时再执行一次;(4)配置参数增加RwTimeout,SaveDetaiLog
2022-01-15     V2.4.7: 加入低电压保护时脱扣策略-103 天能尼日利亚项目
2022-01-17     V2.4.8: 增加IOReader类
2022-01-18to19 V2.4.9: 放开接收远程的合闸分闸命令，本程序只做通道;接收EMS的合闸分闸命令(Modbus)
2022-01-25     V2.4.9: 提取hasEmertStopAlarm(),hasEmsHzCmd(),hasEmsFzCmd(),clearEmsCmd()
2022-03-08     V2.4.10:增加getInstallInfo()实时获取安装组数，提取controlOtherFz()函数。
2022-03-27     V2.4.11:增加熔断器配置策略(DIStrategy=13) 南都德升北仑
2022-03-30     V2.4.11:检测隔离开关断开和闭合增加延时
2022-04-06     V2.4.12:增加消防释放信号策略(DIStrategy=14) 南都双一力 (16:37--)
2022-05-22     V2.4.14:IO通信故障关联到测点aExIOModuConnFault
2022-05-25     V2.4.15:修改汇流开关状态传给usDI1,usDI2, 修改BA不配置消防策略时的消防检测与传递
2022-05-27     修改判断急停有误
2022-06-08     增加消防预警信号检测(只记录日志不参与策略)(DIStrategy=22) YW0318
2022-06-30     亿纬0357, 改BA禁放，放电温度上限保护 或 单体电压下限保护时，驱动分闸
2022-07-05     亿纬0357, 改有箱压差，箱温差告警时，禁充，禁放干节点置位
2022-7-11      修改汇流开关反馈通知BA; 增加BMS-EMS通信故障干节点(DOStrategy=22)
2022-8-2       修改支持读取第2个IO模块数据  
2022-11-5      南都华能达板城IO修改，#1，#2BA的IO配置不一样
2022-11-8      加入 23:UPS告警信号 24:门禁告警信号
2022-11-15     通知熔丝熔断告警到BA(FuseStrategy=999)
2022-11-16     熔丝熔断处理 南网梅州项目，江西测试熔丝熔断告警有跳变 // deleted 2022-11-16

2022-11-17     (1)修改产生多余日志： 低电压保护分励脱扣(DO1);
               (2)优化控制汇流开关分闸后再延时300ms, 否则两次控制会连在一起，分闸DO口闭合会太久;
               (3)控制消防脱扣干节点时，加入同时控制汇流开关脱扣;
               (4)分闸成功重复次数由１次改为2次;
               (5)汇流开关合分日志与BA主程序日志重复,汇流开关策略不是200时才输出.// modified 2022-11-18
2022-12-10     增加消防喷洒信号采集(DIStrategy=25)，消防喷洒动作(DOStrategy=23)，消防喷洒脱扣(DOStrategy=110)

2022-12-21     增加消防故障信号采集(DIStrategy=26)

2023-02-10     修改在熔丝策略(FuseStrategy=999)时,没有熔丝告警(DI6=0)时BA却报了"熔丝熔断"告警, 
               真有熔丝告警(DI6=1)时BA没报"熔丝熔断"告警，但报了“紧急停机”
               
2023-02-18     接收界面的手动控制汇流开关命令(usStackTemp[29]:1-手动合闸  2-手动分闸)

2023-03-13：   改消防故障不脱扣火警干节点; 改读取DI或DO，都多各支持16个

2023-5-29:     南都液冷加入水浸报警

2023-08-21: (1)IO模块通信故障时，输出错误报文日志;
            (2)修改处理16路DI，DO，读取和下发时，都是先读取DI1-8, 再读取DI9-16.
Send Step50 Datagram:FE 02 00 00 00 10 6D C9 //读取16路
Rece Step50 Datagram:FE 02 02 07 01 6E 5C  (DI1,2,3,9为1)

Send Step50 Datagram:FE 02 00 00 00 11 AC 09 //读取17路
Rece Step50 Datagram:FE 02 03 01 00 00 3D 81 (DI1为1)

Send Step50 Datagram:FE 0F 00 00 00 10 02 01 03 E6 45 //设置16路 (设置DO1,9,10为1)
Rece Step50 Datagram:FE 0F 00 00 00 10 40 08 

2023-10-22:增加DI备用策略28,29,30

2023-11-09:增加DI策略 27:消防手动/自动  30:市电断电; 修改消防释放（14）

2023-11-11 整理处理8个备用信号合并成1个

2023-11-17 V2.5.0 修改通信故障细分成3类:只显示通信故障;打印错误报文；打印读取到数据.

2023-11-19:V2.5.1增加汇流开关故障检测 pStack->usStackTemp[28]:1-合闸失败  2-汇流开关异常断开
            pStack->usStackTemp[29]:1-收到清除故障命令  (19:50-20:20)

2023-12-7:V2.5.2 增加读取两个可燃气体 readAllAirData()

2023-12-14:修改先执行3次分励脱扣再执行分闸，修改急停也先分励脱扣
           EmgTkEnabled=1        // 使能急停时脱扣汇流开关
           ExecFltkFirst=1       // 分励脱扣是否优先执行
           
2023-12-17:改IO命令控制
2024-1-23:加入3:主断路器反馈(手动操作，只是检测)  南都酒泉肃州7.5MW30MWh; 配置地址为999时屏蔽IO通迅
2024-2-1:接受modbusTCP的合闸/分闸命令 (南都惠州项目)
2024-2-3:增加空调机组故障采集(DIStrategy=41),液冷机组故障(DIStrategy=42)
2024-4-8:修改南都V3.6.0版, 总簇数超过16簇时,不能合闸bug (南都酒泉肃州)
2024-4-25:修改水浸故障不跳机 (南都酒泉肃州)
*/ 

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);
	// 设置编码方式UTF-8
	//QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBUTF-8);
	//QTextCodec::setCodecForCStrings(QTextCodec::codecForUTF-8e("GBK"));
	//QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
	QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
//	QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
//	QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

	char *publishData = PUBLISH_DATE;
	printf("Dryctrl Version(NDSZ) %d.%d.%d RTDB %d.%d.%d [Publish Date %s] 240501\n",
	APP_VERSION_MAJOR,APP_VERSION_MIDDLE,APP_VERSION_MINOR,
	BAMS_VERSION_MAJOR,BAMS_VERSION_MINOR,BAMS_VERSION_REVISION,publishData);

	//quint16 k = ~(1<<2);
	//quint32 k2 = ~(1<<2);
	//printf("k=========%u,%u\n",k,k2);
	//return 0;

    /*
	QDateTime nowTime = QDateTime::currentDateTime();
	QDateTime other;
	int elapseSec  = other.secsTo(nowTime);
	printf("elapseSec=======%d\n", elapseSec);//other为无效值，得到1995775054，2020-2-22 11：03
    */

	//test save firealarm to db
	/*
	saveFireAlarmToDb(1,32);
	usleep(5 *1000 * 1000); 
	updateAlarmOverToDb();
	*/

	usleep(5 *1000 * 1000); 
	
	KgGlobalData::InitRtdb();   //初始化Rtdb

	KgGlobalData::readConfig(); // modified 2023-11-15
	//writeKgLogfile(QString("读取IO信息:%1.").arg(KgGlobalData::ms_IOConfigStr));
	//return 0;

	/*
	if(isChLang())	   		  
	   saveLogToBaDb(QString("读取IO信息:%1.").arg(KgGlobalData::ms_IOConfigStr));
    else
	   saveLogToBaDb(QString("Read IO Config:%1.").arg(KgGlobalData::ms_IOConfigStr));
	*/
	
	DryCtrlThread dryCtrlThread(NULL);
	KgGlobalData::ms_dryThd = &dryCtrlThread;
	
	dryCtrlThread.start();
	
	return a.exec();
}
